package uiMain.menuconsola;

import java.io.*;
import java.util.*;

import gestorHotel.*;
import gestorHotel.reserva.*;
import gestorHotel.factura.*;
import gestorHotel.habitacion.*;
import gestorHotel.servicios.*;
import gestorHotel.usuarios.*;
import gestorBD.*;
import uiMain.menuconsola.*;
import Servidor.*;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {
	
	public static HashMap<String, Hotel> hoteles;
	public static HashMap<String, Usuario> usuarios;
	public static Usuario usuario;

	public static void main(String[] args) throws IOException {
            try {
                Servidor s = new Servidor();
                Scanner in = new Scanner(System.in);
                GestorBD gestor = new GestorBD();
                usuarios = gestor.getUsuarios();
                hoteles = gestor.getHoteles();
                                                
                // Tipos de usuario
                String[] tipos = {"INVITADO", "CLIENTE", "RECEPCIONISTA", "ADMIN", "SYSADMIN"};
                String[] tiposMsj = {"Invitado", "Cliente registrado", "Recepcionista", "Administrador del hotel", "Administrador del sistema"};
                
                usuario = null;
                while (usuario == null) {
                        System.out.println();
                        System.out.println("Bienvenido! Por favor, elija el rol de usuario:");
                        System.out.println();
                        for (int i = 0; i < tipos.length; ++i)
                                System.out.println((i + 1) + ". " + tiposMsj[i]);
                        System.out.println();
                        System.out.print("Elija una opción: ");
                        
                        String str = in.next();
                        boolean isValid = true;
                        for (int i = 0; i < str.length(); ++i)
                                if (str.charAt(i) < '0' || str.charAt(i) > '9')
                                        isValid = false;
                        int op = -1;
                        if (isValid) {
                                op = Integer.parseInt(str) - 1;
                                if (op < 0 || op >= tipos.length)
                                        isValid = false;
                        }
                        if (!isValid) {
                                System.out.println("Error: opción inválida!");
                                continue;
                        }
                        
                        String tipo = tipos[op];

                        String strUsuario = "invitado";
                        String clave = "invitado";
                        if (op > 0) { // si el usuario es diferente a invitado...
                                System.out.println();
                                System.out.print("Ingrese su nombre de usuario: ");
                                
                                strUsuario = in.next();
                                if (strUsuario == null || strUsuario.isEmpty())
                                        continue;
                                
                                System.out.print("Ingrese su clave: ");
                                
                                clave = in.next();
                                if (clave == null || clave.isEmpty())
                                        continue;
                                
                                if (usuarios.containsKey(strUsuario)) {
                                        Usuario tmpUsuario = usuarios.get(strUsuario);
                                        if (tmpUsuario.getTipo().equals(tipo) && tmpUsuario.getClave().equals(clave))
                                                usuario = tmpUsuario;
                                }
                                
                                if (usuario == null) {
                                        System.out.println("Error: Usuario " + strUsuario + " no encontrado!");
                                }
                        } else {
                                String nombre = "invitado";
                            String primerApellido = "invitado";
                            String segundoApellido = "invitado";
                            String telefono = "invitado";
                            String email = "invitado";
                            String DNI = "invitado";
                            String direccion = "invitado";
                            String numTarjeta = "0";
                            
                            usuario = new Usuario(nombre, primerApellido, segundoApellido, 
                                           telefono, email, DNI, direccion, numTarjeta, strUsuario, clave, tipo);
                        }
                }
                
                System.out.println("Bienvenido " + usuario.getNombre() + "!");
                System.out.println();
                
                
                // Generar las opciones de menú
                MenuDeConsola menu = new MenuDeConsola();
                String tipoUsuario = usuario.getTipo();
                
                if (tipoUsuario.equals("ADMIN")) {
                        menu.agregarOpcion(new OpcionDeMenuCrearHotel());
                        menu.agregarOpcion(new OpcionDeMenuEliminarHotel());
                        menu.agregarOpcion(new OpcionDeMenuModificarHotel());
                        menu.agregarOpcion(new OpcionDeMenuConsultarHotel());
                        menu.agregarOpcion(new OpcionDeMenuCrearHabitacion());
                        menu.agregarOpcion(new OpcionDeMenuEliminarHabitacion());
                        menu.agregarOpcion(new OpcionDeMenuModificarHabitacion());
                        menu.agregarOpcion(new OpcionDeMenuConsultarHabitacion());
                        menu.agregarOpcion(new OpcionDeMenuCrearTipo());
                        menu.agregarOpcion(new OpcionDeMenuEliminarTipo());
                        menu.agregarOpcion(new OpcionDeMenuModificarTipo());
                        menu.agregarOpcion(new OpcionDeMenuConsultarTipo());
                        menu.agregarOpcion(new OpcionDeMenuCrearCategoria());
                        menu.agregarOpcion(new OpcionDeMenuEliminarCategoria());
                        menu.agregarOpcion(new OpcionDeMenuModificarCategoria());
                        menu.agregarOpcion(new OpcionDeMenuConsultarCategoria());
                        menu.agregarOpcion(new OpcionDeMenuEliminarUsuario());
                        menu.agregarOpcion(new OpcionDeMenuModificarUsuario());
                        menu.agregarOpcion(new OpcionDeMenuConsultarUsuario());
                        menu.agregarOpcion(new OpcionDeMenuCrearBebida());
                        menu.agregarOpcion(new OpcionDeMenuEliminarBebida());
                        menu.agregarOpcion(new OpcionDeMenuModificarBebida());
                        menu.agregarOpcion(new OpcionDeMenuConsultarBebida());
                        menu.agregarOpcion(new OpcionDeMenuCrearServicioComunicacion());
                        menu.agregarOpcion(new OpcionDeMenuEliminarServicioComunicacion());
                        menu.agregarOpcion(new OpcionDeMenuModificarServicioComunicacion());
                        menu.agregarOpcion(new OpcionDeMenuConsultarServicioComunicacion());
                } else if (tipoUsuario.equals("CLIENTE")) {
                        menu.agregarOpcion(new OpcionDeMenuCrearReserva());
                        menu.agregarOpcion(new OpcionDeMenuEliminarReserva());
                        menu.agregarOpcion(new OpcionDeMenuModificarReserva());
                        menu.agregarOpcion(new OpcionDeMenuConsultarReserva());
                        menu.agregarOpcion(new OpcionDeMenuConsultaHabitacionDisponible());
                        menu.agregarOpcion(new OpcionDeMenuModificarUsuario());
                        menu.agregarOpcion(new OpcionDeMenuConsultarUsuario());
                        menu.agregarOpcion(new OpcionDeMenuLlegadaCliente());
                        menu.agregarOpcion(new OpcionDeMenuConsumoServicio());
                        menu.agregarOpcion(new OpcionDeMenuCalculoFactura());
                        menu.agregarOpcion(new OpcionDeMenuSalidaCliente());
                } else if (tipoUsuario.equals("RECEPCIONISTA")) {
                        menu.agregarOpcion(new OpcionDeMenuModificarHabitacion());
                        menu.agregarOpcion(new OpcionDeMenuConsultarHabitacion());
                        menu.agregarOpcion(new OpcionDeMenuCrearReserva());
                        menu.agregarOpcion(new OpcionDeMenuEliminarReserva());
                        menu.agregarOpcion(new OpcionDeMenuModificarReserva());
                        menu.agregarOpcion(new OpcionDeMenuConsultarReserva());
                        menu.agregarOpcion(new OpcionDeMenuConsultaHabitacionDisponible());
                } else if (tipoUsuario.equals("INVITADO")) {
                        menu.agregarOpcion(new OpcionDeMenuCrearUsuario());
                }
                
                
                menu.lanzarMenu();
                
                gestor.escribirXML(usuarios, hoteles);
            } catch (RemoteException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            } catch (MalformedURLException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            } catch (AlreadyBoundException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            }
	}
}
